/*
 * Creado el 05/11/2011
 */

package fpuna.ia.ea.instancia;

import java.io.*;

/**
 * @author gusamasan
 */
public class Instancia {
// -----------------------------------------------------------------------------

    public static   String ARCHIVO_KROAB100_TSP = "KROAB100.TSP.TXT";
    public static   String ARCHIVO_KROAC100_TSP = "kroac100.tsp.txt";

    public static   String ARCHIVO_QAP7501_QAP  = "qapUni.75.0.1.qap.txt";
    public static   String ARCHIVO_QAP751_QAP   = "qapUni.75.p75.1.qap.txt";

    private int     cantidadCiudades, cantidadLocalidades;

    private double  matrizAdyacenciaObjetivoUno[][] ,
                    matrizAdyacenciaObjetivoDos[][] ,
                    matrizDistancias[][];
    
// -----------------------------------------------------------------------------

    /** Constructores *********************************************************/
    public Instancia(){

    }
    /**************************************************************************/

    public int obtenerCantidadCiudades(){
        return( this.cantidadCiudades );
    }

    public int obtenerCantidadLocalidades(){
        return( this.cantidadLocalidades );
    }

    public double[][] obtenerMDistancias(){
        return( this.matrizDistancias );
    }

    public double[][] obtenerMObjetivoUno(){
        return( this.matrizAdyacenciaObjetivoUno );
    }

    public double[][] obtenerMObjetivoDos(){
        return( this.matrizAdyacenciaObjetivoDos );
    }

    public void cargarInstanciaTSP( String nombreArchivo ){
    // ------------------------------------------------------------------------

        boolean cargarMAdyacenciaDos;

        int     columna             ,
                contador            ,
                fila;

        double  costoEnlace;

        String linea, filaDatos[];

        BufferedReader input;
        
        File archivo;

    // ------------------------------------------------------------------------
        
        archivo = new File( Instancia.class.getClassLoader().getResource( "fpuna/ia/ea/recurso/" + nombreArchivo ).getFile() );

        try{

            input =  new BufferedReader(new FileReader( archivo ) );

            //linea = null;

            cantidadCiudades                = Integer.parseInt( input.readLine() );

            linea                           = input.readLine(); // esta línea no se utiliza
            
            matrizAdyacenciaObjetivoUno     = new double[ cantidadCiudades ][ cantidadCiudades ];
            matrizAdyacenciaObjetivoDos     = new double[ cantidadCiudades ][ cantidadCiudades ];

            cargarMAdyacenciaDos            = false;
            fila                            = 0;
            columna                         = 0;
            contador                        = 0;

            while (( linea = input.readLine()) != null){                
                contador++;

                linea   = linea.trim();                
                
                if( linea.equals( "" ) ){
                    cargarMAdyacenciaDos = true;
                    fila    = 0;
                    linea   = input.readLine();
                }

                filaDatos   = linea.split( " " );                
                
                if( cargarMAdyacenciaDos ){

                    for( columna=0; columna < cantidadCiudades; columna++ ){
                        costoEnlace = Double.parseDouble( filaDatos[ columna ] );
                        matrizAdyacenciaObjetivoDos[ fila ][ columna ] = costoEnlace;
                    }
                    
                }
                else{
                    for( columna=0; columna < cantidadCiudades; columna++ ){
                        costoEnlace = Double.parseDouble( filaDatos[ columna ] );
                        matrizAdyacenciaObjetivoUno[ fila ][ columna ] = costoEnlace;
                    }
                }
                
                fila++;
            }            

        }
        catch( Exception e ){
          e.printStackTrace();
        }
    }

    public void cargarInstanciaQAP( String nombreArchivo ){
    // ------------------------------------------------------------------------

        boolean cargarMAdyacenciaDos    ,
                cargarMatrizDistancias;

        int     columna             ,
                contador            ,
                fila;

        double  costoEnlace;

        String linea, filaDatos[];

        BufferedReader input;

        File archivo;

    // ------------------------------------------------------------------------
        
        archivo = new File( Instancia.class.getClassLoader().getResource( "fpuna/ia/ea/recurso/" + nombreArchivo ).getFile() );

        try{

            input =  new BufferedReader(new FileReader( archivo ) );

            //linea = null;

            this.cantidadLocalidades            = Integer.parseInt( input.readLine() );
            
            this.matrizAdyacenciaObjetivoUno    = new double[ this.cantidadLocalidades ][ this.cantidadLocalidades ];
            this.matrizAdyacenciaObjetivoDos    = new double[ this.cantidadLocalidades ][ this.cantidadLocalidades ];
            this.matrizDistancias               = new double[ this.cantidadLocalidades ][ this.cantidadLocalidades ];

            cargarMAdyacenciaDos                = false;
            cargarMatrizDistancias              = false;
            fila                                = 0;
            columna                             = 0;
            contador                            = 0;

            while (( linea = input.readLine()) != null){
                
                linea   = linea.trim();
                //System.out.println( "***" + linea + "----" );

                
                if( linea.equals( "" ) ){
                    if( !cargarMAdyacenciaDos ){
                        cargarMAdyacenciaDos = true;                        
                    }
                    else{
                        cargarMatrizDistancias= true;
                    }

                    fila    = 0;
                    linea   = input.readLine();
                    
                }

                filaDatos   = linea.split( " " );
                //System.out.println( "columnas: " + filaDatos.length );
                contador    = 0;

                if( cargarMatrizDistancias ){

                    
                    for( columna=0; columna < this.cantidadLocalidades; columna++ ){
                        
                        while( filaDatos[ contador ].trim().equals( "" ) ){
                            contador++;
                        }

                        costoEnlace = Double.parseDouble( filaDatos[ contador++ ] );
                        this.matrizDistancias[ fila ][ columna ] = costoEnlace;                        
                    }
                }
                else if(cargarMAdyacenciaDos)
                {

                    for( columna=0; columna < this.cantidadLocalidades; columna++ ){

                        while( filaDatos[ contador ].trim().equals( "" ) ){
                            contador++;
                        }

                        costoEnlace = Double.parseDouble( filaDatos[ contador++ ] );
                        this.matrizAdyacenciaObjetivoDos[ fila ][ columna ] = costoEnlace;
                    }

                }
                else{
                    for( columna=0; columna < this.cantidadLocalidades; columna++ ){

                        while( filaDatos[ contador ].trim().equals( "" ) ){
                            contador++;
                        }

                        costoEnlace = Double.parseDouble( filaDatos[ contador++ ] );
                        this.matrizAdyacenciaObjetivoUno[ fila ][ columna ] = costoEnlace;
                    }
                }                 

                fila++;
            }


        }
        catch( Exception e ){
          e.printStackTrace();
        }
    }
}
